# Как запустить воркшоп

> **_Warning:_** Необходимо загрузить > 4Гб
> **_Warning:_** RAM 16Гб

1. `git clone https://gitverse.ru/sc/dtirskikh/spark-cluster-demo.git`
2. `cd spark-cluster-demo`
3. `docker compose build`
4. `docker compose up`

![img.png](img.png)

## Описание сервисов 

### Spark
Apache Spark – это система распределенной обработки данных с открытым исходным кодом, 
которая применяется для обработки больших данных. Быстрое выполнение аналитических запросов к 
данным любого объема обеспечивается благодаря кэшированию в памяти и оптимизированному исполнению запросов.

Первый запуск длится дольше других, так как требуют загрузки библиотек

#### Структура
```
spark-standalone/
    ├── start-spark.sh # Точка входа при запуске контейнера (master|worker|history-server)
    ├── apps/ # Монтируется. Python-скрипты для запуска через spark-submit в кластере
    ├── conf/ # Конфигурация по умолчанию
    ├── data/ # Данные, которые могут быть использованы при spark-submit.
    ├── logs/ # Логи при выполнении master или worker
    ├── logs_event/ # События выполнения приложений для history-server
```

submit-скритпы можно запускать из любой ноды кластера (master или worker).
Предварительно необходимо зайти в один из контейнеров, выполнив команду из директории проекта
```
# Master
docker compose exec -it spark-master /bin/bash

# Worker
docker compose exec -it spark-worker-a /bin/bash
```

Примеры запуска `spark-submit` из кластера
```
/opt/spark/bin/spark-submit /opt/spark-apps/test_data.py
/opt/spark/bin/spark-submit /opt/spark-apps/test_minio.py
```

Историческая информация о работе приложений доступна по адресу: http://localhost:18080/ 

Во время работы spark-приложения: http://localhost:4040 \
Если есть одновременные запуски, то необходимо указывать следующий порт: 4041, 4042, ...

Мастер доступен по адресу: http://localhost:9090  \
Воркеры: http://localhost:9091 и http://localhost:9092

### Jupyter
Jupyter-ноутбук — это среда разработки, где сразу можно видеть результат выполнения
кода и его отдельных фрагментов. Отличие от традиционной среды разработки в том, 
что код можно разбить на куски и выполнять их в произвольном порядке.

#### Структура 
```
jupyter/
    ├── workshop/ # Монтируется. Сохраняет настройки и ноутбуки
```

Web: http://127.0.0.1:8888/
Необходимо в логах контейнера найти ссылку с токеном. Иначе приложение не позволяет зайти
```
docker compose logs jupyter 2>&1 | grep "?token"
```
Ссылка будет примерно такой, только с другим токеном 
```
http://127.0.0.1:8888/lab?token=e4b7a12929435fbe981ffaf422eadef31f0cbf567ba62cd1
```

Все логи по умолчанию пишутся в консоль. Чтобы увидеть их в ноутбуке, необходимо выполнить следующие действия:

В терминале выполнить команду `ipython profile create;` или в ячейке `!ipython profile create;` \
В файле `jupyter/workshop/.ipython/profile_default/ipython_kernel_config.py` 
раскомментировать строку `c.IPKernelApp.capture_fd_output = True`; 

Перезапустить kernel в ноутбуке. \
C помощью тестовой тетрадки `test.ipynb` есть возможность протестировать обработку данные их Minio


### Minio
MinIO — это высокопроизводительное объектное хранилище с открытым исходным кодом, 
предназначенное для локального использования или в качестве альтернативы облачному хранилищу, такому как Amazon S3.

#### Структура

```
minio/
    ├── data/ # Монтируется. Сохраняет настройки и бакеты
```

Web: http://localhost:9001/
```shell
Login: yandex.practicum
Password: yandex.practicum
```
